package es.ucm.fdi.pe.practica3.genetico3;


public class Cruce {

	public void cruce(Individuo padre1, Individuo padre2) {
		Arbol subarbol1, subarbol2;
		int num_nodos=Math.min(padre1.getArbol().getNum_nodos(),padre2.getArbol().getNum_nodos());
		int nodo_cruce = alea_entero(1,num_nodos);
		//System.out.println("\nNodo cruce: "+nodo_cruce);
		subarbol1 = new Arbol(padre1.getArbol().BuscarNodo(nodo_cruce));
		subarbol2 = new Arbol(padre2.getArbol().BuscarNodo(nodo_cruce));
		try {
			padre1.getArbol().SustituirSubarbol(nodo_cruce,subarbol2);
			padre2.getArbol().SustituirSubarbol(nodo_cruce,subarbol1);
		} catch (Exception e) {
			System.out.println("EXCEPCION Cruce: "+e.getMessage());
		}
		padre1.setFitness();
		padre2.setFitness();
	}

	private int alea_entero(int min, int max) {
		double a = Math.random();
		return min+(int)(a*(1+max-min));
	}
	
	public static void main (String[] args){
		Individuo i1= new Individuo(2,2);		
		System.out.println("Individuo 1: ");
		System.out.println(i1.getArbol().recorridoEnProfundidad("   "));
		System.out.println("");
		
		Individuo i2= new Individuo(2,2);
		System.out.println("Individuo 2: ");
		System.out.println(i2.getArbol().recorridoEnProfundidad("   "));
		System.out.println("");
		
		Cruce c= new Cruce();
		c.cruce(i1,i2);
		
		System.out.println("Hijo 1: ");
		System.out.println(i1.getArbol().recorridoEnProfundidad("   "));
		System.out.println("");

		System.out.println("Hijo 2: ");
		System.out.println(i2.getArbol().recorridoEnProfundidad("   "));
		System.out.println("");
	}

}
